package com.corpgovernment.organization.util;

import cn.hutool.core.util.StrUtil;
import com.corpgovernment.api.organization.model.user.NameInfoBo;
import com.ctrip.corp.obt.generic.utils.JsonUtils;
import com.ctrip.corp.obt.generic.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class StrUtils {
    private static Pattern sqlPattern = Pattern.compile("\\b(and|exec|insert|select|drop|grant|alter|delete|update|count|chr|mid|master|truncate|char|declare|or)\\b|(\\*|;|\\+|'|%)");

    /**
     * 根据英文姓,名 拼接英文全名
     * 【英文完整名字拼接】例如：
     * surname：""   givenname：zhengshi
     * fullEnName（英文完整名字拼接）:  zhengshi
     *
     * surname：wang   givenname：""
     * 前端fullEnName（英文完整名字拼接）: wang
     *
     * surname："" givenname：""
     * fullEnName（英文完整名字拼接）: ""
     * @param surname
     * @param givenname
     * @return
     */
    public static String processFullEnName(String surname,String givenname){
        String fullEnName = null;
        if(StrUtil.isNotBlank(surname) && StrUtil.isNotBlank(givenname)){
            fullEnName = StrUtil.join("/",surname,givenname);
        } else if (StrUtil.isNotBlank(surname)) {
            fullEnName = surname;
        } else if (StrUtil.isNotBlank(givenname)) {
            fullEnName = givenname;
        }
        return fullEnName;
    }

    /**
     * 校验nameInfoBo数据
     * @param nameInfoBo
     * @return true:数据正确校验通过,存储nameinfo信息; false:数据异常校验不通过,设置nameinfo信息为null
     */
    public static boolean checkNameInfo(NameInfoBo nameInfoBo){
        log.info("setNameInfo log :{}", JsonUtils.toJsonString(nameInfoBo));
        if(StrUtil.isNotBlank(nameInfoBo.getFullName())){
            return true;
        }
        if(StrUtil.isNotBlank(nameInfoBo.getSurname())
                && StrUtil.isNotBlank(nameInfoBo.getGivenname())){
            return true;
        }
        log.error("setNameInfo log error:{}", JsonUtils.toJsonString(nameInfoBo));
        return false;
    }

    /**
     * 字符串剔除空格
     *
     */
    public static Object fieldRemoveSpace(Object obj){
        Field[] declaredField = obj.getClass().getDeclaredFields();
        Arrays.stream(declaredField).forEach(item ->{
            item.setAccessible(true);
            try {
                Object value = item.get(obj);
                if (Objects.nonNull(value) && value instanceof String){
                    item.set(obj , String.valueOf(value).trim());
                }
            } catch (IllegalAccessException e) {
                log.error("fieldRemoveSpace", e);
            }
        });
        return obj;
    }
    /**
     * 字符串剔除空格和空行
     *
     */
    public static Object fieldRemoveWarp(Object obj){
        Field[] declaredField = obj.getClass().getDeclaredFields();
        Arrays.stream(declaredField).forEach(item ->{
            item.setAccessible(true);
            try {
                Object value = item.get(obj);
                if (Objects.nonNull(value) && value instanceof String){
                    item.set(obj , String.valueOf(value).replaceAll("\\s+", ""));
                }
            } catch (IllegalAccessException e) {
                log.error("fieldRemoveWarp", e);
            }
        });
        return obj;
    }

    /**
     * 字符串是否存在字符串列表中
     *
     * @param source
     * @param params
     * @return
     */
    public static boolean In(String source, String... params) {
        if (params == null || params.length <= 0) {
            return false;
        }
        for (String s : params) {
            if (StringUtils.equalsIgnoreCase(s, source)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 字符串是否存在字符串列表中
     *
     * @param source
     * @param params
     * @return
     */
    public static boolean In(String source, List<String> params) {
        if (params == null || params.size() <= 0) {
            return false;
        }
        for (String s : params) {
            if (StringUtils.equalsIgnoreCase(s, source)) {
                return true;
            }
        }
        return false;
    }
    public static boolean havingChinese(String str) {
        if (StringUtils.isNotBlank(str)) {
            Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
            Matcher m = p.matcher(str);
            return m.find();
        }
        return false;
    }
    /**
     * sql校验关键字
     *
     * @param sWord
     * @return
     */
    public static Boolean checkSqlParam(String sWord) {
        Matcher matcher = sqlPattern.matcher(sWord);
        return matcher.find();
    }

    /**
     * 对列表的类型中的某个字段进行拼接字符串
     * 目前支持：包装器类型、BigDecimal的转换、枚举类型
     *
     * @param objects   对象列表
     * @param clazz     列表类型的class
     * @param fieldName 需要拼接的字段名称
     * @param separator 分隔符
     * @param format    格式字符串，其中字段的值用"[fieldName]"标识，例如"%s [name] %s"；假如是BigDecimal的，则传入DecimalFormat的格式字符串。
     * @param params    格式化的值
     */
    public static <T> String appendString(List<T> objects, Class<T> clazz, String fieldName, String separator, String format, Object... params) throws NoSuchFieldException, IllegalAccessException {
        StringBuilder text = new StringBuilder();
        if (objects == null || objects.size() <= 0) {
            return text.toString();
        }
        Field[] fields = clazz.getDeclaredFields();
        Field currentField = null;
        for (Field field : fields) {
            if (field.getName().equals(fieldName)) {
                currentField = field;
                currentField.setAccessible(true);
            }
        }
        if (currentField == null) {
            throw new NoSuchFieldException();
        }
        for (T object : objects) {
            String temp;
            String typeName = currentField.getType().getSimpleName();
            if ("char[]".equals(typeName)) {
                temp = String.valueOf((char[]) currentField.get(object));
            } else {
                temp = String.valueOf(currentField.get(object));
            }
            if (StringUtils.isNotBlank(format)) {
                format = format.replace("[" + fieldName + "]", temp);
                temp = String.format(format, params);
            }
            text.append(temp);
            text.append(separator);
        }
        if (objects.size() > 0) {
            text.deleteCharAt(text.length() - 1);
        }
        return text.toString();
    }
}
